package com.tduck.cloud.form.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONParser;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.tduck.cloud.common.util.JsonUtils;
import com.tduck.cloud.common.util.Result;
import com.tduck.cloud.form.constant.FormConstants;
import com.tduck.cloud.form.entity.UserFormEntity;
import com.tduck.cloud.form.mapper.UserFormMapper;
import com.tduck.cloud.form.service.UserFormService;
import com.tduck.cloud.form.util.HtmlUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.StringUtil;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Objects;

/**
 * 表单主表(Form)表服务实现类
 *
 * @author smalljop
 * @since 2020-11-18 18:16:18
 */
@Slf4j
@Service
public class UserFormServiceImpl extends ServiceImpl<UserFormMapper, UserFormEntity> implements UserFormService {

    private static String HOSPITAL_NAME = "";

    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private UserFormMapper userFormMapper;

    @Override
    public UserFormEntity getByKey(final String key) {
        if (StrUtil.isBlank(key)) {
            return null;
        }
        return this.getOne(Wrappers.<UserFormEntity>lambdaQuery().eq(UserFormEntity::getFormKey, key));
    }

    /**
     * 查询打印信息
     *
     * @param formKey
     * @param itemId
     */
    @Override
    public Result queryPrintInfoRequest(String formKey, Long itemId) {
        log.info("开始进行表单 {} 中选项 {} 的数据分析工作！", formKey, itemId);
        // 配置表中查询 存储过程/方法 名称
        String processName = userFormMapper.queryFormConfig(formKey);
        if (StrUtil.isBlank(processName)) {
            return Result.failed(String.format("formKey[%s] 未配置计算逻辑，请联系管理员配置！", formKey));
        }
        log.info("表单 {} 对应的存储过程是 {}！", formKey, processName);
        // 查询医院名称
        if (StrUtil.isBlank(HOSPITAL_NAME)) {
            HOSPITAL_NAME = userFormMapper.querySysConfig(FormConstants.HOSPITAL_NAME);
            if (StrUtil.isBlank(HOSPITAL_NAME)) {
                return Result.failed("请联系管理员在系统配置表SYS_ENV_CONFIG中配置医院信息！");
            }
        }
        log.info("配置表中存储的医院名称是 {}！", HOSPITAL_NAME);
        // 查询表单名称
        UserFormEntity userFormEntity = this.getByKey(formKey);
        if (Objects.isNull(userFormEntity)) {
            return Result.failed(String.format("根据表单key[%s]未能查询到表单信息，请联系管理员！", formKey));
        }

        // 拼装sql执行查询
        String querySql = "SELECT %s(%d, \'%s\') AS RESULT FROM DUAL";
        querySql = String.format(querySql, processName, itemId, formKey);
        log.info("拼装好的查询sql是 {}", querySql);

        String result = "";
        try {
            result = jdbcTemplate.queryForObject(querySql, String.class);
        } catch (Exception e) {
            log.info("表单 {} 中选项 {} 的分析数据获取失败！", formKey, itemId);
            e.printStackTrace();
            return Result.failed(String.format("表单 %s 中选项 %s 的分析数据获取失败，请联系管理员！", formKey, itemId));
        }
        log.info("result is : {}", result);
        if (StrUtil.isBlank(result)) {
            return Result.failed(String.format("表单 %s 中选项 %s 的分析数据获取为空，请联系管理员！", formKey, itemId));
        }
        if (!JsonUtils.isJson(result)) {
            return Result.failed(String.format("表单 %s 中选项 %s 的分析数据不是json格式，请联系管理员！", formKey, itemId));
        }

        // 返回数据中增加医院名称和表单名称
        JSONObject jsonObject = new JSONObject(result);
        jsonObject.put("hospitalName", HOSPITAL_NAME.replaceAll("^\"*", "").replaceAll("\"*$", ""));
        jsonObject.put("formName", HtmlUtils.cleanHtmlTag(userFormEntity.getName()));
        log.info("表单 {} 中选项 {} 的分析数据获取成功，返回数据为{}", formKey, itemId, jsonObject);
        return Result.success(jsonObject.toString());
    }

    @Override
    public void insertForm(UserFormEntity form) {
        userFormMapper.insertForm(form);
    }

    @Override
    public Result queryServerUrl(String envKey) {
        String serverUrl = userFormMapper.querySysConfig(envKey);
        if (StringUtils.isEmpty(serverUrl)) {
            return Result.failed("请联系管理员在配置表[SYS_ENV_CONFIG]配置后端服务地址[SERVER_URL_PORT]");
        }
        return Result.success(serverUrl.replaceAll("^\"*", "").replaceAll("\"*$", ""));
    }


}